package com.zjff.myshop.util;

import com.aliyun.oss.*;
import com.aliyun.oss.model.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


import cn.hutool.core.util.IdUtil;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URL;
import java.util.*;


@Component("AliyunOSSUtil")
public class AliyunOSSUtil {
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    // 在URL中添加Bucket名称，添加后URL格式为http://yourBucketName.oss-cn-hangzhou.aliyuncs.com/。
    private String urlBase() {
        return endpoint.replace("http://", "http://" + bucketName + ".") + "/";
    }

    //获取访问存储桶的连接
    private OSS getOssClient() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        return ossClient;
    }

    /**
     * 向存储桶上传文件
     */
    public HashMap uploadFile(MultipartFile file, String path) throws IOException {
        String fileName = file.getOriginalFilename(); //上传文件的名字
        String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名
        path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖，所以用UUID作为文件名

        //元数据信息
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentLength(file.getSize());
        meta.setContentEncoding("UTF-8");
        meta.setContentType(file.getContentType());

        //向存储桶中保存文件
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, path, file.getInputStream(), meta);

        OSS client = getOssClient();
        PutObjectResult putObjectResult = client.putObject(putObjectRequest);

        //合成外网访问地址
        HashMap map = new HashMap();
        map.put("url", urlBase() + path);
        map.put("path", path);

        //如果保存的是图片，用数据万象服务对图片内容审核
//        if (List.of(".jpg", ".jpeg", ".png", ".gif", ".bmp").contains(fileType)) {
//            //审核图片内容
//            ImageAuditingRequest request = new ImageAuditingRequest();
//            request.setBucketName(bucketPublic);
//            request.setDetectType("porn,terrorist,politics,ads"); //辨别黄色、暴利、政治和广告内容
//            request.setObjectKey(path);
//            ImageAuditingResponse response = client.imageAuditing(request); //执行审查
//            /*
//             * 这里去掉了政治内容的审核，因为身份证背面照片有国徽，
//             * 会被腾讯云判定为政治内容，导致无法在存储桶保存身份证背面照片
//             */
//            if (!response.getPornInfo().getHitFlag().equals("0")
//                    || !response.getTerroristInfo().getHitFlag().equals("0")
//                    || !response.getAdsInfo().getHitFlag().equals("0")
//            ) {
//                //删除违规图片
//                client.deleteObject(bucketPublic, path);
//                throw new HxdsException("图片内容不合规");
//            }
//        }
        client.shutdown();
        return map;
    }


    /**
     * 获取私有读写文件的临时URL外网访问地址(如果存储桶是是由读的话）
     */
    public String getPrivateFileUrl(String path) {
        OSS ossClient = getOssClient();
        // 设置签名URL过期时间，单位为毫秒。
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
        // 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
        URL url = ossClient.generatePresignedUrl(bucketName, path, expiration);
        ossClient.shutdown();
        return url.toString();
    }

    /**
     * 刪除存储桶的文件
     */
    public void deleteFile(String[] pathes) {
        OSS client = getOssClient();
        for (String path : pathes) {
            //如果有urlBase字符串开始的，则去掉。
            if (path.contains(urlBase())) {
                path = path.replace(urlBase(), "");
            }
            client.deleteObject(bucketName, path);
        }
        client.shutdown();
    }
}
